package com.blog.modeles;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

import com.blog.services.GestionBaseDeDonnees;
import com.blog.beans.Article;
import com.blog.beans.Utilisateur;
import org.apache.log4j.Logger;

public class ModeleArticleDAO extends modeleDAO
{
	Logger log = Logger.getLogger(ModeleArticleDAO.class);
	private ResultSet resultat;
	private Connection connexion;	
	private List<Article> listeArticles;
	/**
	 * login.
	 */
	private String login;
	//	private List<Article> listeNArticles;
	//-------------------------------------------------------------------------------------------------------------------------
	//-------------------------------------------------------------------------------------------------------------------------
	public int ajouterArticle(Article article) // ajouter un article dans la base
	{
		log.info("Entering ajouterArticle(Article article"+article+")");
		// Variables
		PreparedStatement requete=null; // Déclaration d'un tube vide, appelé "requete", qui contiendra la requête SQL précompilée
		String requeteString=null; // Chaîne de caractères, appelée "requeteString", qui contiendra le texte de la requête
		int codeErreur=0; // Sert à stocker le code d'erreur
		// Corps de la méthode
		try
		{	
			connexion=super.getConnection(); // Ouverture d'une connexion, via la méthode héritée
			log.info("connexion : "+connexion);
			// Préparation de la requête
			requeteString="INSERT INTO ARTICLES (TITRE_ARTICLE, CONTENU_ARTICLE, ID_USER) VALUES(?,?,?)";
			log.info("requeteString : "+requeteString);
			requete=connexion.prepareStatement(requeteString);
			log.info("requete : "+requete);
			requete.setString(1, article.getTitreArticle()); // On attribue des valeurs aux paramètres de la requête
			log.info("requete : "+requete);
			// l'ID et la date sont implicites
			requete.setString(2, article.getContenuArticle());
			log.info("requete : "+requete);
			requete.setInt(3, article.getCreateurArticle().getIdUser());
			log.info("requete : "+requete);
			// Execution de la requête de MISE A JOUR (un ajout est une mise à jour), et récupération du code d'erreur
			codeErreur=requete.executeUpdate();
		}
		catch(Exception e)
		{
			codeErreur=1;
			System.out.println("Erreur dans la requete dans la classe ModeleArticleDAO fonction ajouterArticle : "+e);
		}
		finally {GestionBaseDeDonnees.closeAll(connexion,requete,resultat);} // On ferme tous les objets SQL
		// Retourner le code d'erreur
		log.info("Exiting ajouterArticle(Article article"+article+") - return codeErreur = "+codeErreur);
		return codeErreur;
	}
	//-------------------------------------------------------------------------------------------------------------------------
	public List<Article> ListerArticle(int limite) // retourner la liste complète des articles
	{	
		log.info("Entering List<Article> ListerArticle(int limite ="+limite+")");
		// Variables
		PreparedStatement requete=null; // Déclaration d'un tube vide, appelé "requete", qui contiendra la requête SQL précompilée
		Article article=null; // Déclaration d'un nouvel Article vide appelé "article"
		String requeteString=null; // Chaîne de caractères, appelée "requeteString", qui contiendra le texte de la requête
		listeArticles=new ArrayList<Article>(); // Instanciation d'un objet ArrayList de Article(s), dans l'objet "listeArticles", qui est une liste de Article(s)
		//	listeNArticles=new ArrayList<Article>(); // Instanciation d'un objet ArrayList de Article(s), dans l'objet "listeArticles", qui est une liste de Article(s)
		//	int i;
		// Corps de la méthode
		try
		{	
			connexion=super.getConnection(); // Ouverture d'une connexion, via la méthode héritée
			log.info("Connexion ouverte :"+connexion);
			// requete pour la liste des clients
			if (limite == 0)
			{
				requeteString="SELECT ID_ARTICLE, TITRE_ARTICLE, DATE_CREA_ARTICLE, CONTENU_ARTICLE, ARTICLES.ID_USER, NOM_USER, PRENOM_USER, LOGIN_USER, PWD_USER, EMAIL_USER, NOM_ROLE FROM ARTICLES, UTILISATEURS WHERE ARTICLES.ID_USER=UTILISATEURS.ID_USER ORDER BY DATE_CREA_ARTICLE DESC";
			}
			else
			{
				requeteString="SELECT ID_ARTICLE, TITRE_ARTICLE, DATE_CREA_ARTICLE, CONTENU_ARTICLE, ARTICLES.ID_USER, NOM_USER, PRENOM_USER, LOGIN_USER, PWD_USER, EMAIL_USER, NOM_ROLE FROM ARTICLES, UTILISATEURS WHERE ARTICLES.ID_USER=UTILISATEURS.ID_USER ORDER BY DATE_CREA_ARTICLE DESC LIMIT "+limite;
			}
			log.info("Requete envoyee au serveur :"+requeteString);
			// Le texte de la requête SQL
			requete=connexion.prepareStatement(requeteString); // On compile le tube avec en paramètre le texte de la requête SQL
			log.info("PreparedStatement :"+requete);
			resultat=requete.executeQuery(); // Execution du tube contenant la requête SQL
			log.info("Resultat de la requete :"+resultat);
			// On stocke le resultat dans une liste
			if(resultat!=null) // Si on a au moins un élément dans le ResultSet "résultat" 
			{
				log.info("Le resultset est non vide");
				while(resultat.next()) // Tant que le ResultSet contient encore des lignes
				{
					log.info("Remplissage de la liste principale");
					// On effectue le mapping des attributs avec les champs de la table SQL
					article=mapperArticle(resultat);
					log.info("Article article = "+article);
					// On ajoute l'objet "article" ainsi enrichi, à la liste des articles
					listeArticles.add(article);
					log.info("listeArticles = "+listeArticles);
				}
				//	i=0;
				//	log.info("i = "+i);
				//	while(resultat.next() && i<5) 
				//	{
				//	log.info("i = "+i);
				//	log.info("Remplissage de la liste secondaire");
				//	article=mapperArticle(resultat);
				//	log.info("Article article = "+article);
				//	listeNArticles.add(article);
				//	log.info("listeArticles = "+listeArticles);
				//	i++;
				//	log.info("i = "+i);
				//	}
			}
		}
		catch(Exception e){System.out.println("Erreur dans la requete dans la classe ModeleClientDAO fonction getListeArticles - Erreur : "+e);} // Si Erreur <
		finally {GestionBaseDeDonnees.closeAll(connexion,requete,resultat);} // On ferme tous les objets SQL
		log.info("Exiting List<Article> ListerArticle() - Return :"+listeArticles);
		return listeArticles; // Retourner la liste des articles
	}
	//-------------------------------------------------------------------------------------------------------------------------
	public Article afficherArticle(int idArticle) // trouver un article dans la base
	{ 
		log.info("Entering afficherArticle(int idArticle = "+idArticle+")");
		// Variables
		PreparedStatement requete=null; // Déclaration d'un tube vide, appelé "requete", qui contiendra la requête SQL précompilée
		Article article=null; // Déclaration d'un nouvel Article vide appelé "article"
		String requeteString=null; // Chaîne de caractères, appelée "requeteString", qui contiendra le texte de la requête

		// Corps de la méthode
		try
		{
			log.info("Entering try");
			connexion=super.getConnection(); // Ouverture d'une connexion, via la méthode héritée
			log.info("Connexion ouverte :"+connexion);
			// Préparation de la requête
			requeteString = "SELECT ID_ARTICLE, TITRE_ARTICLE, DATE_CREA_ARTICLE, CONTENU_ARTICLE, ARTICLES.ID_USER, NOM_USER, PRENOM_USER, LOGIN_USER, PWD_USER, EMAIL_USER, NOM_ROLE FROM ARTICLES, UTILISATEURS WHERE ARTICLES.ID_USER=UTILISATEURS.ID_USER AND ID_ARTICLE=?";
			log.info("Requete envoyee au serveur :"+requeteString);
			// Le "?" représente un paramètre, qui sera rempli par un setInt, setString (...)
			requete=connexion.prepareStatement(requeteString);
			log.info("PreparedStatement :"+requete);
			requete.setInt(1,idArticle); // On remplit le paramètre indiqué, dans le tube PreparedStatement (ici le paramètre N°1)
			// Execution de la requête
			resultat=requete.executeQuery();
			log.info("Resultat de la requete :"+resultat);

			// On stocke le resultat dans l'objet client, avec mapping des attributs
			if(resultat!=null){if(resultat.next()){article=mapperArticle(resultat);}}
			log.info("Exiting try");
		}
		catch(Exception e)
		{
			article=null;
			log.info("Erreur dans la requete dans la classe ModeleArticleDAO fonction getArticle");
		}
		finally {GestionBaseDeDonnees.closeAll(connexion,requete,resultat);} // On ferme tous les objets SQL
		log.info("Exiting afficherArticle(int idArticle = "+idArticle+") return article = "+article);
		return article;
	}
	//-------------------------------------------------------------------------------------------------------------------------
	public int modifierArticle(Article article) // modifier un client dans la base
	{
		log.info("Entering modifierArticle(Article article = "+article+")");
		// Variables
		PreparedStatement requete=null; // Déclaration d'un tube vide, appelé "requete", qui contiendra la requête SQL précompilée
		String requeteString=null; // Chaîne de caractères, appelée "requeteString", qui contiendra le texte de la requête
		int codeErreur=0; // Sert à stocker le code d'erreur
		// Corps de la méthode
		try
		{	
			log.info("Entering try");
			connexion=super.getConnection(); // Ouverture d'une connexion, via la méthode héritée
			log.info("Connexion ouverte :"+connexion);
			// Préparation de la requête visant à modifier, dans la table de base de données, la ligne correspondant à l'idClient sélectionné
			requeteString="UPDATE ARTICLES SET TITRE_ARTICLE=?, CONTENU_ARTICLE=? WHERE articles.ID_ARTICLE=? LIMIT 1;";
			log.info("Requete envoyee au serveur :"+requeteString);
			requete=connexion.prepareStatement(requeteString);
			log.info("PreparedStatement :"+requete);
			requete.setString(1, article.getTitreArticle());
			log.info("PreparedStatement :"+requete);
			requete.setString(2, article.getContenuArticle());
			log.info("PreparedStatement :"+requete);
			requete.setInt(3, article.getIdArticle());
			log.info("PreparedStatement :"+requete);
			// Execution de la requête de MISE A JOUR (une modification est une mise à jour), et récupération du code d'erreur
			codeErreur=requete.executeUpdate();
			log.info("codeErreur :"+codeErreur);
			log.info("Exiting try");
		}
		catch(Exception e){System.out.println("Erreur dans la requete dans la classe ModeleArticleDAO fonction modifierArticle - ERREUR : "+e);}
		finally {GestionBaseDeDonnees.closeAll(connexion,requete,resultat);} // On ferme tous les objets SQL
		// Retourner le code d'erreur
		log.info("Exiting modifierArticle(Article article = "+article+") return codeErreur = "+codeErreur);
		return codeErreur;
	}
	//-------------------------------------------------------------------------------------------------------------------------
	public int supprimerArticle(int idArticle) // supprimer un article dans la base
	{
		// Variables
		PreparedStatement requete=null; // Déclaration d'un tube vide, appelé "requete", qui contiendra la requête SQL précompilée
		String requeteString=null; // Chaîne de caractères, appelée "requeteString", qui contiendra le texte de la requête
		int codeErreur=0; // Sert à stocker le code d'erreur
		// Corps de la méthode
		try
		{	
			connexion=super.getConnection(); // Ouverture d'une connexion, via la méthode héritée
			// Préparation de la requête visant à supprimer, dans la table de base de données, la ligne correspondant à l'idarticle sélectionné
			requeteString="DELETE FROM ARTICLES WHERE ID_ARTICLE=?";
			requete=connexion.prepareStatement(requeteString);
			requete.setInt(1, idArticle);
			// Execution de la requête de MISE A JOUR (une suppression est une mise à jour), et récupération du code d'erreur
			codeErreur=requete.executeUpdate();
		}
		catch(Exception e)
		{
			codeErreur=0;
			System.out.println("Erreur dans la requete dans la classe ModeleArticleDAO fonction supprimerArticle");
		}
		finally {GestionBaseDeDonnees.closeAll(connexion,requete,resultat);} // On ferme tous les objets SQL
		// Retourner le code d'erreur
		return codeErreur;
	}
	//-------------------------------------------------------------------------------------------------------------------------
	//-------------------------------------------------------------------------------------------------------------------------
	//-------------------------------------------------------------------------------------------------------------------------



	public Article mapperArticle(ResultSet resultat) // Réaliser la transformation Relationnel vers Objet (mapping)
	{
		log.info("Entering mapperArticle(ResultSet resultat = "+resultat+")");
		// Variables
		Article article=new Article();
		Utilisateur createurArticle=new Utilisateur();
		try 
		{	
			//Mapping de l'article
			log.info("============= Mapping de l article =============");
			log.info("============= ID_ARTICLE =============> "+resultat.getString("ID_ARTICLE"));
			if (resultat.getString("ID_ARTICLE")==null){article.setIdArticle(0);}
			else {article.setIdArticle(resultat.getInt("ID_ARTICLE"));}

			log.info("============= TITRE_ARTICLE =============> "+resultat.getString("TITRE_ARTICLE"));
			if (resultat.getString("TITRE_ARTICLE")==null)
			{
				article.setTitreArticle("");
				article.setTitreArticleCourt("");
			}
			else
			{
				article.setTitreArticle(resultat.getString("TITRE_ARTICLE"));
				article.setTitreArticleCourt(resultat.getString("TITRE_ARTICLE"));
			}
			log.info("============= TITRE_ARTICLE_COURT =============> "+article.getTitreArticleCourt());

			log.info("============= DATE_CREA_ARTICLE =============> "+resultat.getString("DATE_CREA_ARTICLE"));
			if (resultat.getString("DATE_CREA_ARTICLE")==null){article.setDateCreationArticle("");}
			else {article.setDateCreationArticle(resultat.getString("DATE_CREA_ARTICLE"));}

			log.info("============= CONTENU_ARTICLE =============> "+resultat.getString("CONTENU_ARTICLE"));
			if (resultat.getString("CONTENU_ARTICLE")==null){article.setContenuArticle("");}
			else {article.setContenuArticle(resultat.getString("CONTENU_ARTICLE"));}

			log.info("============= Mapping du createur de l article =============");
			log.info("============= ARTICLES.ID_USER =============> "+resultat.getString("ARTICLES.ID_USER"));
			if (resultat.getString("ARTICLES.ID_USER")==null){createurArticle.setIdUser(0);}
			else {createurArticle.setIdUser(resultat.getInt("ARTICLES.ID_USER"));}

			log.info("============= NOM_USER =============> "+resultat.getString("NOM_USER"));
			if (resultat.getString("NOM_USER")==null){createurArticle.setNomUser("");}
			else {createurArticle.setNomUser(resultat.getString("NOM_USER"));}
			log.info("============= PRENOM_USER =============> "+resultat.getString("PRENOM_USER"));
			if (resultat.getString("PRENOM_USER")==null){createurArticle.setPrenomUser("");}
			else {createurArticle.setPrenomUser(resultat.getString("PRENOM_USER"));}
			log.info("============= LOGIN_USER =============> "+resultat.getString("LOGIN_USER"));
			if (resultat.getString("LOGIN_USER")==null){createurArticle.setLoginUser("");}
			else {createurArticle.setLoginUser(resultat.getString("LOGIN_USER"));}
			log.info("============= PWD_USER =============> "+resultat.getString("PWD_USER"));
			if (resultat.getString("PWD_USER")==null){createurArticle.setPwdUser("");}
			else {createurArticle.setPwdUser(resultat.getString("PWD_USER"));}
			log.info("============= EMAIL_USER =============> "+resultat.getString("EMAIL_USER"));
			if (resultat.getString("EMAIL_USER")==null){createurArticle.setEmailUser("");}
			else {createurArticle.setEmailUser(resultat.getString("EMAIL_USER"));}

			log.info("============= NOM_ROLE =============> "+resultat.getString("NOM_ROLE"));
			if (resultat.getString("NOM_ROLE")==null){createurArticle.setRoleUser("");}
			else {createurArticle.setRoleUser(resultat.getString("NOM_ROLE"));}

			//insertion de l'objet Utilisateur dans l'article
			log.info("============= insertion de l objet Utilisateur dans l article =============");
			article.setCreateurArticle(createurArticle);

		}
		catch (Exception e) //S'il y a une erreur durant le mapping des attributs
		{
			article=null;
			log.info("Erreur lors du mapping des attributs d'un article dans la class ModeleArticleDAO, fonction mapperArticle - Erreur : "+e);
		}
		log.info("Exiting mapperArticle() return article :"+article);
		return article;
	}
	//-------------------------------------------------------------------------------------------------------------------------